package model;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import simulacao.Atendimento;
import exception.ContaInexistenteException;
import global.Global;

public class Terminal {

	private Agencia agencia;
	private int codTerminal;
	private Cliente cliente;

	public Terminal(Agencia agencia, int codTerminal) {
		this.agencia = agencia;
		this.codTerminal = codTerminal;
		this.cliente = null;
	}

	public void abrirSessao(Cliente cliente) {
		this.cliente = cliente;
	}

	public void fecharSessao() throws InterruptedException {
		this.cliente = null;
		this.agencia.getControle().liberarTerminal(this);
	}

	public StatusMensagemEnum sacar(Integer inteiro, Integer decimal,
			Atendimento at) throws ContaInexistenteException,
			InterruptedException {

		if (cliente.getCodAgencia() == agencia.getCodigo()) {
			if ((inteiro > 1000) || (inteiro == 1000 && decimal > 0)) {
				return StatusMensagemEnum.SAQUEINVALIDOMESMAAG;
			}
			Boolean resposta = agencia.retirada(inteiro, decimal,
					cliente.getCodConta(), at);

			if (resposta) {
				return StatusMensagemEnum.SUCESSOSAQUE;
			} else {
				return StatusMensagemEnum.SALDOINSUFICIENTE;
			}
		} else {
			try {
				if ((inteiro > 500) || (inteiro == 500 && decimal > 0)) {
					return StatusMensagemEnum.SAQUEINVALIDOOUTRAAG;
				}
				Socket socket = new Socket(this.agencia.getIP(this.cliente
						.getCodAgencia()), Global.PORTA);

				ObjectOutputStream oos = new ObjectOutputStream(
						socket.getOutputStream());
				Saque msgSaque = new Saque(inteiro, decimal,
						cliente.getCodConta());
				System.out.println("Enviando pedido de saque para Agencia "
						+ cliente.getCodAgencia());
				oos.writeObject(msgSaque);

				ObjectInputStream ois = new ObjectInputStream(
						socket.getInputStream());
				StatusMensagemEnum status = (StatusMensagemEnum) ois
						.readObject();

				if (status == StatusMensagemEnum.SUCESSO) {
					status = StatusMensagemEnum.SUCESSOSAQUE;
				}

				return status;
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return StatusMensagemEnum.ERROINESPERADO;
	}

	public StatusMensagemEnum depositar(Integer inteiro, Integer decimal,
			String codConta, Integer codAgencia, Atendimento at)
			throws ContaInexistenteException, InterruptedException {

		if (codAgencia == agencia.getCodigo()) {
			agencia.deposito(inteiro, decimal, codConta, at);
			return StatusMensagemEnum.SUCESSO;
		} else {
			try {
				Socket socket = new Socket(this.agencia.getIP(codAgencia),
						Global.PORTA);

				ObjectOutputStream oos = new ObjectOutputStream(
						socket.getOutputStream());
				Deposito msgDeposito = new Deposito(inteiro, decimal, codConta);
				System.out.println("Enviando pedido de deposito para Agencia "
						+ codAgencia);
				oos.writeObject(msgDeposito);

				ObjectInputStream ois = new ObjectInputStream(
						socket.getInputStream());
				StatusMensagemEnum status = (StatusMensagemEnum) ois
						.readObject();

				return status;
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return StatusMensagemEnum.ERROINESPERADO;
	}

	public StatusMensagemEnum transferir(Integer inteiro, Integer decimal,
			String codConta, int codAgencia, String codContaDestino,
			int codAgenciaDestino, Atendimento at)
			throws ContaInexistenteException, InterruptedException {

		if (codAgencia == agencia.getCodigo()) {
			Boolean resposta = agencia.retirada(inteiro, decimal, codConta, at);

			if (!resposta) {
				return StatusMensagemEnum.SALDOINSUFICIENTE;
			}
		} else {
			try {
				Socket socket = new Socket(this.agencia.getIP(codAgencia),
						Global.PORTA);

				ObjectOutputStream oos = new ObjectOutputStream(
						socket.getOutputStream());
				Saque msgSaque = new Saque(inteiro, decimal, codConta);
				System.out.println("Enviando pedido de saque para Agencia "
						+ codAgencia);
				oos.writeObject(msgSaque);

				ObjectInputStream ois = new ObjectInputStream(
						socket.getInputStream());
				StatusMensagemEnum status = (StatusMensagemEnum) ois
						.readObject();

				if (status == StatusMensagemEnum.SALDOINSUFICIENTE) {
					return status;
				}

			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		StatusMensagemEnum respostaDeposito = depositar(inteiro, decimal,
				codContaDestino, codAgenciaDestino, at);
		return respostaDeposito;
	}

	public String toString() {
		return String.valueOf(this.codTerminal);
	}
}
